<?php

	function aCSV($data)
	{
		$source = 'tmp/excel.csv';
		@unlink($source);

		if (isset($data['tablas'])){
		 	foreach($data['tablas'] as $tabla){
				if (isset($tabla['sobreCont'])){

					writeCSVLine($tabla['sobreEnc'],$source);

					writeCSVArray($tabla['sobreCont'],$source);
					writeCSVLine(array(""),$source);
				
				}
				if (isset($tabla['contenido'])){
					array_unshift($tabla['encabezado'],"");
					writeCSVLine($tabla['encabezado'],$source);

					writeCSVArray($tabla['contenido'], $source,true);
					writeCSVLine(array(""),$source);
				}
			}
		}else{
			writeCSVArray($data, $source, false);
		}
		descargar_archivo($source);
		@unlink($source);
	}
	
	function writeCSVArray($array, $source, $firstempty=false){

		foreach($array as $fila){
			if ($firstempty) array_unshift($fila,"");
			writeCSVLine($fila,$source);
		}

	}

	function writeCSVLine($fila, $source)
	{
		$handle = fopen($source, "a");
		$linea	= '"';
		$separador='';
		foreach ($fila as $celda){
			$linea.=$separador.$celda;
			$separador='";"';
		
		}
		$linea = $linea.'"'."\n";
		fwrite($handle, utf8_decode($linea));
		fclose($handle);
	}





	function descargar_archivo($file){
		
	    //First, see if the file exists
	    if (!is_file($file)) { die("<b>404 File not found!</b>"); }

	    //Gather relevent info about file
	    $len = filesize($file);
	    $filename = basename($file);
	    $file_extension = strtolower(substr(strrchr($filename,"."),1));

	    //This will set the Content-Type to the appropriate setting for the file
	    switch( $file_extension ) {
		  case "pdf": $ctype="application/pdf"; break;
	      case "exe": $ctype="application/octet-stream"; break;
	      case "zip": $ctype="application/zip"; break;
	      case "doc": $ctype="application/msword"; break;
	      case "xls": $ctype="application/vnd.ms-excel"; break;
	      case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
	      case "gif": $ctype="image/gif"; break;
	      case "png": $ctype="image/png"; break;
	      case "jpeg":
	      case "jpg": $ctype="image/jpg"; break;
	      case "mp3": $ctype="audio/mpeg"; break;
	      case "wav": $ctype="audio/x-wav"; break;
	      case "mpeg":
	      case "mpg":
	      case "mpe": $ctype="video/mpeg"; break;
	      case "mov": $ctype="video/quicktime"; break;
	      case "avi": $ctype="video/x-msvideo"; break;
	      case "csv": $ctype="application/vnd.ms-excel"; break;
	      case "html": $ctype="text/html"; break;
	      
	      //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
	      case "php":
	      case "htm":
	      case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

	      default: $ctype="application/force-download";
	      
	    }

	    //Begin writing headers
	    header("Pragma: public");
	    header("Expires: 0");
	    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
	    header("Cache-Control: public");
	    header("Content-Description: File Transfer");
	   
	    //Use the switch-generated Content-Type
	    header("Content-Type: $ctype");

	    //Force the download
	    $header="Content-Disposition: attachment; filename=".$filename.";";
	    header($header );
	    header("Content-Transfer-Encoding: binary");
	    header("Content-Length: ".$len);
	    @readfile($file);
	    exit;
	}
	
	/**
	 * Trae los datos del excel especificado
	 * Requiere tener cargado la libreria PHPExcel
	 * @param $srcArchivo
	 * @param $offset
	 * @param $maximo
	 * @param $seleccionados
	 * @param $sinVacios
	 * @return unknown_type
	 */
	function getDatosExcel($srcArchivo,$offset=1,$maximo=1000,$seleccionados=NULL,$sinVacios = true){
		
		//$this->load->library('PHPExcel');
		
		//echo "antes de todo".(memory_get_usage(true) / 1024 / 1024)."<br>";
		//Se carga el archivo desde la ubicacion indicada... Capaz que habria que cargarlo una sola vez... Capaz no!!! SEGURO!!!
		$objPHPExcel = cargarExcel($srcArchivo,$offset,$maximo+100);

		if ($seleccionados==NULL) {
			$seleccionados = range(0, 15);
		}
		//print_r($seleccionados);
		//exit();
		//echo "antes del worksheet ".(memory_get_usage(true) / 1024 / 1024)."<br>";

		$worksheet = $objPHPExcel->getActiveSheet();
		//echo "despues del worksheet ".(memory_get_usage(true) / 1024 / 1024)."<br>";
		
		//Se toma cada una de las hojas del documento de excel y se itera sobre ellas.
		//foreach ($objPHPExcel->getWorksheetIterator() as ) {
		//echo '- ' . $worksheet->getTitle() . "\r\n";
			
		$idFila = 1;
		//Elementos a insertar los guardo en un array de arrays y los nombres de las columnas en otro.
		$datosInsertar = array();
		//$columnas = array();
		//$columnas[] = 'Seleccione';
		$excedido = false;
		
		//echo "antes del foreach ".(memory_get_usage(true) / 1024 / 1024)."<br>";
		//Se toma cada fila del excel y se itera sobre ella.
		
		//foreach ($worksheet->getRowIterator() as $row)
		for ($rowi = $offset; $rowi <= ($offset+$maximo); ++$rowi) 
		{
			//echo "en el primer for each".(memory_get_usage(true) / 1024 / 1024)."<br>";
			//echo '    - Row number: ' . $row->getRowIndex() . "\r\n";
			//echo '<br />';
			// Iniciar identificador de columna
			$idColumna = 1;
			$columnasVacias = 0;
			
			//$cellIterator = $row->getCellIterator();
			//$cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
			//foreach ($cellIterator as $cell)
			for ($coli = 0; $coli <= 15; ++$coli) 
			{
				$cell = $worksheet->getCellByColumnAndRow($coli, $rowi);
				if (isset($seleccionados[$idColumna]) ){
					$dato = $seleccionados[$idColumna];
					if (!is_null($cell))
					{							
						//if ($row->getRowIndex() == 1) {
						//if ($rowi == 1){
							//$columnas[$dato] = $cell->getValue();

						//} else {
							//echo '::fi:'.$idFila;
							//echo '::col:'.$dato;
							//echo '::val:'.$cell->getValue();
							$datosInsertar[$idFila][$dato] = $cell->getValue();
							
						//}


					} else {
						$datosInsertar[$idFila][$dato] = '';
					}
					
					if ($datosInsertar[$idFila][$dato]==''){
						if ($sinVacios) {
							unset($datosInsertar[$idFila][$dato]);
						}
						$columnasVacias++;
					}
				}
				$idColumna++;
				if ($idColumna > 15) break;

			}
			//echo '<br />';
			
			// Ver si todos los campos estan vacios, si es asi: frenar
			if($columnasVacias == count($seleccionados)) {
				unset($datosInsertar[$idFila]);
			}
			
			
			$idFila++;
			/*if (($idFila % 100) == 0) {
				echo "A los ".$idFila.":".(memory_get_usage(true) / 1024 / 1024)."<br>";
			}*/
			/* Antes del foreach 29.5
			 * A los 100:29.5 ,A los 200:29.5,A los 300:29.5,A los 400:30,A los 500:30
			 * A los 600:30,A los 700:30,A los 800:30,A los 900:30.25,A los 1000:31.25
			 * Despues sube 1M cada 100
			 */
			if (count($datosInsertar) >= $maximo) {
				//echo 'mmax'.count($datosInsertar)+10;
				//echo maximo;
				// Mostrar error de cantidad excedida
				//echo 'Cantidad limite excedida.('.$maximo.')';
				$excedido = true;
				break;
			}
			// && !is_null($cell->getCalculatedValue())

		 } // foreach()
		

		//echo "despues for each".(memory_get_usage(true) / 1024 / 1024)."<br>";

		//echo "Cantidad a insertar:".count($datosInsertar)."<br />";
		
		/*if ($excedido!== false) {
			print_r($datosInsertar);
		}*/
		alertar("Insertados: ".count($datosInsertar)." Memoria ".(memory_get_usage(true) / 1024 / 1024));
		//alertar(" Offset: ".$offset." Maximo:".$maximo." Source:".$srcArchivo);
		if (count($datosInsertar)>0){
			alertar("S:".substr(serialize($datosInsertar),0,100));
			//alertar(" Sm:".substr(serialize($datosInsertar[30]),0,200));
			//alertar("Sl:".substr(serialize($datosInsertar),-200));
		}
		//alertar(" Source:".$srcArchivo);

		
		//echo "Cantidad insertado:".$resultado."<br />";
		/*if ($excedido!== false) {
			$resultado;
		}*/

		return array('datos'=>$datosInsertar,'excedido'=>$excedido);
		
		
	}
	
	/**
	 * Abre el excel especificado
	 * Requiere tener cargado la libreria PHPExcel
	 * @param $srcArchivo
	 * @param $offset
	 * @param $limite
	 * @return unknown_type
	 */
	function cargarExcel($srcArchivo, $offset = false, $limite = 0)
	{
		//$this->load->library('PHPExcel');
		
		//echo "cargando el archivo ".(memory_get_usage(true) / 1024 / 1024)."<br>";
		$objReader = PHPExcel_IOFactory::createReader('Excel5');
		//echo "Clase creada ".(memory_get_usage(true) / 1024 / 1024)."<br>";
			
		$lector =  new ReaderPorPartes();
		$lector->setInicio($offset);
		$lector->setFin($offset + $limite);
		$objReader->setReadFilter( $lector );

		//echo "Clase el nuevo lector ".(memory_get_usage(true) / 1024 / 1024)."<br>";
		$objPHPExcel = $objReader->load($srcArchivo);
		//echo "devuelve objeto ".(memory_get_usage(true) / 1024 / 1024)."<br>";
		return $objPHPExcel;

	}

	function alertar($string,$archivo='alertas.log'){
		//$ddf = fopen('error.log','a');
		//fwrite($ddf,"\n[".date("r")."] ".$string);
		//fclose($ddf);		
	}
	
?>
